class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        // dp[i][j][k] 表示：从前 i 个字符串中挑选，字符 0 的个数不超过 j ,
        // 字符 1 的个数不超过 k ，所有的选法中，最大的长度
        int len = strs.size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
        for(int i = 1; i <= len; ++i)
        {
            int a = 0, b = 0;
            for(auto& e : strs[i - 1]) // 统计0和1的个数
            {
                if(e == '0')
                    ++a;    
                else
                    ++b;
            }
            for(int j = m; j >= 0; --j)
            {
                for(int k = n; k >= 0; --k)
                {
                    if(j >= a && k >= b)
                        dp[j][k] = max(dp[j][k], dp[j - a][k - b] + 1) ;
                    else
                        dp[j][k] = dp[j][k];
                }
            }
        }
        return dp[m][n];
    }
};